In software engineering, a profiler is an application that monitors another application (used herein interchangeably with the term program) and gathers runtime information from the monitored application while that application operates. The profiler determines information about that application's behavior based on the gathered runtime information. A profiler is typically used to identify an application's performance bottlenecks to help a software engineer improve the application.
One method used by profilers to monitor an application is to generate stack traces of that application during runtime. A stack trace is a report of active stack frames in a call stack for the monitored application at a particular point during execution of the application, where each stack frame corresponds to an uncompleted function. Most profilers generate stack traces by following a linked list of frame pointers that are included in the call stack, where each frame pointer points to a location on the call stack of a preceding stack frame. However, in some instances some or all stack frames on the call stack do not have frame pointers. In such instances, the profiler generates the stack trace by walking through the call stack and recording each portion of the call stack that appears to be a return address. This method commonly produces false positives, in which a region of the call stack that appeared to include a return address did not actually include a return address. Thus, stack traces of call stacks that include one or more stack frames lacking frame pointers are often not accurate.